package com.xupt.top;


/**
 * @author zhaoxin
 * @title: IsSymmetric
 * @projectName LeetCode
 * @description: 101. 对称二叉树
 * @date 2019/12/16 9:46
 */
public class IsSymmetric {

    /**
     * 给定一个二叉树，检查它是否是镜像对称的。
     *
     * 例如，二叉树 [1,2,2,3,4,4,3] 是对称的。
     *
     *     1
     *    / \
     *   2   2
     *  / \ / \
     * 3  4 4  3
     * 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
     *
     *     1
     *    / \
     *   2   2
     *    \   \
     *    3    3
     * 说明:
     *
     * 如果你可以运用递归和迭代两种方法解决这个问题，会很加分。
     *
     * @param root
     * @return
     */
    public boolean isSymmetric(TreeNode root) {
        return isMirror(root, root);
    }

    /**
     *
     * 如果同时满足下面的条件，两个树互为镜像：
     *
     * 1) 它们的两个根结点具有相同的值。
     * 2) 每个树的右子树都与另一个树的左子树镜像对称。
     *
     * 判断是否是一颗镜像tree
     * @param t1
     * @param t2
     * @return
     */
    private boolean isMirror(TreeNode t1, TreeNode t2){
        if (t1 == null && t2 == null){
            return true;
        }
        if (t1 == null || t2 == null){
            return false;
        }

        return (t1.val == t2.val && isMirror(t1.left, t2.right) && isMirror(t2.right, t2.left));

    }

}
